package com.foo.designpattern.proxy.dynamicproxy1.cglibdynamicproxy1;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * com.foo.designpattern.proxy.dynamicproxy1.cglibdynamicproxy1
 * Created with IntelliJ IDEA.
 * Created by jiang on 2016-04-29 23:05.
 *
 * @Description 代理类：cglib实现动态代理
 * JDK的动态代理机制只能代理实现了接口的类，而不能实现接口的类就不能实现JDK的动态代理。
 * cglib是针对类来实现代理的，他的原理是对指定的目标类生成一个子类，并覆盖其中方法实现增强，
 * 但因为cglib采用的是继承，所以不能对final修饰的类进行代理。
 */

public class FilterHandler implements MethodInterceptor {
    private Object proxyObject;

    /**
     * 创建代理对象
     *
     * @param proxyObject
     * @return 返回类型：Object
     */
    public Object getInstance(Object proxyObject) {
        this.proxyObject = proxyObject;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.proxyObject.getClass());
        // 回调方法
        enhancer.setCallback(this);
        // 创建代理对象
        return enhancer.create();
    }

    // 实现MethodInterceptor接口方法，编写逻辑处理类
    @Override
    public Object intercept(Object object, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println(method + " 执行之前");
        methodProxy.invokeSuper(object, objects);
        System.out.println(method + " 执行之后");
        return null;
    }
}
